package single;

/**
 * 饱汉模式 懒加载
 * 通过分析hashCode发现为线程不安全的。
 *
 * synchronized 使用 可以保证线程的安全但是带来了性能问题。
 * 加锁效率下降，因为存在相互等待的抢占锁的问题。并行变串行。
 */
public class demo2 {
    public static void main(String args[]){
        //Single single = Single.getIns();

        int i = 0;
        while (i<100){
            new Thread(()->{
                System.out.println(Single.getIns().hashCode());
            }).start();
            i++;
        }

    }
}

class Single{
    private Single(){}

    private static volatile Single INS; // 这里为什么加 volatile 因为防止java指令级别汇编优化重排。优化器 JIT 这玩意变为c

//    public static synchronized Single getIns(){
    public static  Single getIns(){
        if(null == INS){

            synchronized(Single.class) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                if(null == INS) {
                    INS = new Single();
                }
            }
        }

        return INS;
    }
}